// src/main/windowCreator.ts
import { BrowserWindow, BrowserWindowConstructorOptions } from 'electron'
import { resolve, join, isAbsolute } from 'path'
import { registerWindowShortcuts } from './shortcuts' // 导入快捷键注册函数
import { is } from '@electron-toolkit/utils' // 导入工具函数
// 定义窗口配置参数类型（扩展 Electron 原生配置，增加自定义参数）
interface WindowOptions extends BrowserWindowConstructorOptions {
  title: string // 窗口标题
  entry: string // 窗口加载的入口（开发环境 URL 或生产环境 HTML 路径）
}

export class WindowCreator {
  public window: BrowserWindow | null = null // 存储窗口实例
  private options: WindowOptions // 窗口配置

  constructor(options: WindowOptions) {
    const params = {
      ...options
    }
    if (options.icon) {
      const iconPath = join(process.cwd(), 'resources/' + options.icon)
      params.icon = iconPath
    }
    // 合并默认配置和用户传入配置
    this.options = {
      // 默认配置（可根据需求调整）
      width: 1000,
      height: 600,
      show: false, // 先不显示，等加载完成再显示（避免白屏）
      webPreferences: {
        // 预加载脚本路径（确保绝对路径，避免之前的找不到文件错误）
        preload: resolve(__dirname, '../preload/index.js'),
        // nodeIntegration: false, // 禁用 Node 集成（安全最佳实践）
        sandbox: false, // 启用沙箱模式（安全最佳实践）
        contextIsolation: true // 启用上下文隔离（安全最佳实践）
      },
      // 覆盖用户传入的配置
      ...params
    }
    console.log('配置信息', this.options)

    // 初始化窗口
    this.initWindow()
  }
  // 初始化窗口
  private initWindow() {
    // 创建窗口实例
    this.window = new BrowserWindow(this.options)

    // 加载入口（区分开发/生产环境）
    this.loadEntry()
    // 注册窗口快捷键
    this.registerShortcuts()

    // 窗口事件监听（通用逻辑）
    this.setupEvents()
  }

  // 加载窗口入口
  private loadEntry() {
    if (!this.window) return

    const { entry } = this.options

    // 开发环境：使用 Vite 服务 URL
    if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
      const devBase = process.env['ELECTRON_RENDERER_URL']
      if (/^https?:\/\//.test(entry)) {
        this.window.loadURL(entry)
      } else {
        this.window.loadURL(`${devBase}/${entry}`)
      }
      return
    }

    // 生产环境：本地文件路径，支持 "index.html#/route?query" 形式
    let file = entry
    let hash = ''
    let search = ''

    const hashIndex = file.indexOf('#')
    if (hashIndex !== -1) {
      hash = file.substring(hashIndex + 1)
      file = file.substring(0, hashIndex)
    }

    const searchIndex = file.indexOf('?')
    if (searchIndex !== -1) {
      // Electron 的 loadFile 接受不带 '?' 的 search 字符串
      search = file.substring(searchIndex + 1)
      file = file.substring(0, searchIndex)
    }

    // 绝对路径直接使用；否则拼接到打包后的 renderer 目录
    const filePath = isAbsolute(file) ? file : join(__dirname, '../renderer/', file)

    this.window.loadFile(filePath, {
      // 如果存在 hash 或 search，则附带
      hash: hash || undefined,
      search: search || undefined
    })
  }

  // 注册窗口快捷键
  private registerShortcuts() {
    if (!this.window) return
    registerWindowShortcuts(this.window)
  }

  // 窗口事件监听（可根据需求扩展）
  private setupEvents() {
    if (!this.window) return
    // 窗口准备好后显示（避免白屏）
    this.window.on('ready-to-show', () => {
      this.window?.show()
    })
    // 禁用窗口打开新标签页
    this.window.webContents.setWindowOpenHandler(() => {
      return { action: 'deny' }
    })
    // 窗口关闭时清理实例和监听器
    this.window.on('closed', () => {
      this.window = null
    })
    this.window.on('hide', () => {
      this.window?.webContents.executeJavaScript('window.dispatchEvent(new Event("unload"))')
    })

    // 开发环境打开调试工具
    // if (import.meta.env.DEV) {
    //   this.window.webContents.openDevTools()
    // }
  }

  // 暴露一个显示窗口的方法（可选）
  public show() {
    this.window?.show()
  }

  // 暴露一个隐藏窗口的方法（可选）
  public hide() {
    this.window?.hide()
  }
}
